/**
 * 逻辑运算符
 *   && || ！
 * 
 * 短路评估
 *   为了使逻辑 AND返回 true，两个操作数的计算结果都必须为 true。如果左操作数的计算结果为 false，则逻辑 AND知道它必须返回 false，无论右操作数的计算结果是 true 还是 false。
 *   在这种情况下，逻辑 AND运算符将继续执行并立即返回 false，甚至无需评估正确的操作数！这称为短路评估，主要是为了优化目的。
 *   
 *   同样，如果逻辑 OR的左操作数为 true，则整个 OR 条件必须计算为 true，并且不会计算右操作数。
 * 
 * 短路评估可能会导致逻辑或和逻辑与无法评估正确的操作数。避免将具有副作用的表达式与这些运算符结合使用。
 * 
 * 只有这些运算符的内置版本才能执行短路评估。如果您重载这些运算符以使它们适用于您自己的类型，则这些重载的运算符将不会执行短路求值。
 * 
 * 最佳实践
 *   当在单个表达式中混合逻辑 AND和逻辑 OR时，请显式地为每个运算加上括号，以确保它们按照您的意图进行计算。
 * 
 * 德摩根定律告诉我们在这些情况下逻辑 NOT应该如何分布：
 *   !(x && y)相当于!x || !y
 *   !(x || y)相当于!x && !y
 * 
 * 
 * 逻辑异或 (XOR) 运算符在哪里
 *   C++ 不提供逻辑异或运算符（运算符^是按位异或，而不是逻辑异或）。
 * 
 *   可以使用不等运算符 (!=)轻松模拟逻辑 XOR
 *   if (a != b) ... // a XOR b, assuming a and b are Booleans
 *   这可以扩展到多个操作数
 *   if (a != b != c != d) ... // a XOR b XOR c XOR d, assuming a, b, c, and d are Booleans
 * 
 * 如果您需要一种适用于非布尔操作数的逻辑 XOR形式，您可以将操作数 static_cast 为 bool
 * if (static_cast<bool>(a) != static_cast<bool>(b) != static_cast<bool>(c) != static_cast<bool>(d)) ... // a XOR b XOR c XOR d, for any type that can be converted to bool
 * 下面这行和上面等价，且更加简洁
 * if (!!a != !!b != !!c != !!d)
 * 
 * 替代运算符表示
 *   && and
 *   || or
 *   !  not
 *   
 * 
 */

#include <iostream>

bool isEven(int n) {
    return !(n % 2);
}

int main() {
    std::cout << "Enter an integer: ";
    int x {};
    std::cin >> x;

    if (isEven(x)) {
        std::cout << "x is even\n";
    } else {
        std::cout << "x is odd\n";
    }

    return 0;
}